1. /* srmredc.cpp by K.Tsuru */
  2. // function ID = 801 BRADIX
  3. /*****************************
  4. SRational class
  5. It provides a reducuction.
  6. *****************************/
  7. #ifndef SN_H
  8. #include "sn.h"
  9. #endif
  10. static const uint initReduceSize = 512u; //initial value of reduceSize
  11. uint SRational::reduceSize = initReduceSize;
  12. void SRational::reduce(bool must){
  13. if( !num.Sign(801) ){ SetZero(); return; } //numerator is zero
  14. if( num.IsOne() || den.IsOne() ) reduceDone = true; //numerator or denominator is one
  15. if( reduceDone == true ) return;
  16. // reduceDone = false
  17. //When the number of figures is small it does not reduce.
  18. if( !must && ( max( num.Head(), den.Head() ) < reduceSize) ) return;
  19. //To make the reduction as late as possible it divides num and den by 2^b*R^r.
  20. if( !(num[0] % 2u) && !(den[0] % 2u) ) ReduceByPow2Rdx(num, den);
  21. if( !must && ( max( num.Head(), den.Head() ) < reduceSize) ) return;
  22. //reduction
  23. SLong d = gcdL(num, den); // d > 0, type of d is BIN_INT
  24. num /= d; den /= d;
  25. reduceDone = true;
  26. //When the calculation for large figures continues it enlarges the value of reduceSize.
  27. uint rds = min(num.Head(), den.Head()) +1u;
  28. if(rds > reduceSize) reduceSize = min(4u*rds, num.MaxSize());
  29. else reduceSize = initReduceSize;
  30. }

srmredc.cpp : last modifiled at 2016/06/30 14:50:55(1,294 bytes)
created at 2016/06/26 15:57:35
The creation time of this html file is 2016/09/18 20:28:05 (Sun Sep 18 20:28:05 2016).